package pl.gettoknowme.mobile.android.services.sms;

import java.util.HashMap;
import java.util.Map;

/**
 * Analizator danych występujących we wiadomości SMS
 * @author Michał Kołodziejski
 */
public class SmsAnalyzer {
    
    public static final String[] KEYWORDS = {
        
        /* STUDIA */
        "egzamin",
        "sesja",
        "inżynierk",
        "inzynierk",
        "inżyniersk",
        "inzyniersk",
        "magisterk",
        "magistersk",
        "licencjat",
        "licencjac",
        "studia",
        "podyplom",
        "nauka",
        "promotor",
        "dziekan",
        "prodziekan",
        "recenzent",
        "uczelni",
        "politechnik",
        "uniwersytet",
        "doktorat",
        "doktorski",
        "kolokwi",
        "projekt",
        "seminarium",
        "akademik",
        
        /* TANIEC */
        "sals",
        "boogi",
        "bachat",
        "taniec",
        "tanc",
        "rock'n'roll",
        "tango",
        "kizomb",
        "rumb",
        "mambo",
        "rued",
        "dance",
        "reggaeton",
        "samba",
        
        /* SPORT */
        "sport",
        "mecz",
        "koszykowk",
        "siatk",
        "nba",
        "fifa",
        "uefa",
        "stadion",
        "snooker",
        "pilk",
        "wyscig",
        "liga",
        "puchar",
        "euro",
        "kibic",
        "rower",
        "rolki",
        "biegan",
        "biegać",
        "biegac",
        "basen",
        "plywa",
        "pływa",
        "zeglow",
        "żeglow",
        "łódk",
        "lodk",
        "motorowk",
        "motorówk",
        "zaglow",
        "żaglów",
        "żagle",
        "zagle",
        "jacht",
        "trening",
        "trener",
        "łyżw",
        "lyzw",
        "lodowisk",
        "gokart",
        "squash",
        "turniej",
        "narty",
        "snowboard",
        "biegowki",
        "biegówki",
        
        /* PRACA */
        "prac",
        "klien",
        "nadgodzin",
        "konferencj",
        "wyplat",
        "wypłat",
        "urlop",
        "wakac",
        "biuro",
        "szkolen",
        "prezentacj",
        "homework",
        
        /* PRZEKLEŃSTWA */
        "kurw",
        "pierdol",
        "jeban",
        "zajeb",
        "huj",
        
        /* DZIELNICE WARSZAWY */
        "centrum",
        "srodmiesc",
        "wola",
        "mokot",
        "ursynow",
        "ursynów",
        "bielan",
        "praga",
        "zolibo",
        "żolibo",
        "mlocin",
        "młocin",
        "imielin",
        "natolin",
        "kabat",
        
        /* PAŃSTWA EURO */
        "polsk",
        "rosj",
        "czech",
        "francj",
        "niemc",
        "hiszp",
        "wloch",
        "włoch",
        "grecj",
        "portugal",
        "angli",
        "szwecj",
        "ukrain",
        "chorwa",
        "irland",
        "dania",
        "szwajc",
        "austri",
        "belgi",
        
        /* DZIECI */
        "cork",
        "córk",
        "dziecko",
        "dzieci",
        "przedszkol",
        "szkola",
        "zlobek",
        "żłobek",
        "zlobk",
        "żłobk",
        "niania",
        "wywiadówk",
        "wywiadowk",
        
        /* IMPREZY */
        "imprez",
        "browar",
        "piwo",
        "piwko",
        "wino",
        "wodk",
        "wódk",
        "whisky",
        "zapitk",
        "papieros",
        "fajk",
        "klub",
        "dyskoteka",
        "drink",
        "pijem",

        /* SKRÓTOWCE */
        "tnx",
        "thx",
        "pls",
        "lol",
        "rotfl",
        "afaik",
        "afair",
        
        /* INNE */
        "poker",
        "brydż",
        "brydz",
        "szach",
        "tatr",
        "morze",
        "plaż",
        "plaza",
        "lezak",
        "leżak",
        "ognisk",
        "grill",
        "spacer",
        "pociąg",
        "pociag",
        "autobus",
        "tramw",
        "samolot",
        "tax",
        "taks",
        "ksiazk",
        "książk",
        "czyta",
        "bibliot",
        "kino",
        "kina",
        "seans",
        "film",
        "teatr",
        "spektakl",
        "koncert",
        "koncerc",
        "telewiz",
        "wycieczk",
        "wypraw",
        "zwiedza",
        "samoch",
        "motocykl",
        "motor",
        "pizz",
        "kebab",
        "kebs",
        "kredyt",
        "bank",
        "mieszk",
        "dom",
        "działk",
        "dzialk",
        "pies",
        "kot",
        "remont",
        "mebl",
        "przeprow"
    };

    public SmsAnalyzer() {
    }
    
    /**
     * Analizuje dane wiadomości SMS pod kątem występowania słów kluczowych
     * @param smsMessage wiadomość SMS
     * @return mapa (słowo -> ilość wystąpień)
     */
    public Map<String, Integer> analyzeSmsMessage(SmsMessage smsMessage){
        return analyzeSmsMessage(smsMessage, null);
    }

    /**
     * Analizuje dane wiadomości SMS pod kątem występowania słów kluczowych
     * @param smsMessage wiadomość SMS
     * @return mapa (słowo -> ilość wystąpień)
     */
    public Map<String, Integer> analyzeSmsMessage(SmsMessage smsMessage,
            Map<String, Integer> initialMap){
        if(initialMap == null){
            initialMap = new HashMap<String, Integer>();
        }
        String lowercaseSmsBody = smsMessage.getBody().toLowerCase();
        
        int startIdx;
        int occurences;
        for(String keyword : KEYWORDS){
//            LoggingUtil.d(SmsAnalyzer.class, "searching for word number "+ i++);
            boolean start = true;
            startIdx = 0;
            occurences = 0;
            while (startIdx != -1){
                if(!start){
                    startIdx += keyword.length();
                }
                start = false;
                startIdx = lowercaseSmsBody.indexOf(keyword, startIdx);
                if(startIdx != -1){
                    ++occurences;
                }
            };
            
            if(occurences != 0){
                Integer savedOcc = initialMap.get(keyword);
                if(savedOcc == null){
                    initialMap.put(keyword, Integer.valueOf(occurences));
                } else {
                    initialMap.put(keyword, Integer.valueOf(savedOcc.intValue() + occurences));
                }
            }
        }
        
        return initialMap;
    }
}
